# Copyright 2020 by Kurt Rathjen. All Rights Reserved.
#
# This library is free software: you can redistribute it and/or modify it 
# under the terms of the GNU Lesser General Public License as published by 
# the Free Software Foundation, either version 3 of the License, or 
# (at your option) any later version. This library is distributed in the 
# hope that it will be useful, but WITHOUT ANY WARRANTY; without even the 
# implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 
# See the GNU Lesser General Public License for more details.
# You should have received a copy of the GNU Lesser General Public
# License along with this library. If not, see <http://www.gnu.org/licenses/>.

import os
import logging

from FXstudiovendor.Qt import QtGui
from FXstudiovendor.Qt import QtCore
from FXstudiovendor.Qt import QtWidgets

import FXstudioqt
import FXstudiolibrary
import FXstudiolibrary.widgets

try:
	import FXmutils
	import FXmutils.gui
	import maya.cmds
except ImportError as error:
	print(error)


logger = logging.getLogger(__name__)


class BaseLoadWidget(QtWidgets.QWidget):

	"""Base widget for loading items."""

	def __init__(self, item, parent=None):
		"""
		:type item: FXstudiolibrarymaya.BaseItem
		:type parent: QtWidgets.QWidget or None
		"""
		QtWidgets.QWidget.__init__(self, parent)

		self.setObjectName("studioLibraryBaseLoadWidget")
		self.setWindowTitle("Load Item")

		self.loadUi()

		self._item = item
		self._scriptJob = None
		self._formWidget = None

		widget = self.createTitleWidget()
		'''
		jesus
		widget.ui.menuButton.clicked.connect(self.showMenu)
		'''
		self.ui.titleFrame.layout().addWidget(widget)

		# Create the icon group box
		groupBox = FXstudiolibrary.widgets.GroupBoxWidget("Icon", self.ui.iconFrame)
		groupBox.setObjectName("iconGroupBoxWidget")
		groupBox.setPersistent(True)
		self.ui.iconTitleFrame.layout().addWidget(groupBox)

		# Create the thumbnail widget and set the image
		self.ui.thumbnailButton = FXstudiolibrary.widgets.ImageSequenceWidget(self)
		self.ui.thumbnailButton.setObjectName("thumbnailButton")
		self.ui.thumbnailFrame.layout().insertWidget(0, self.ui.thumbnailButton)

		if os.path.exists(item.imageSequencePath()):
			
			self.ui.thumbnailButton.setPath(item.imageSequencePath())

		elif os.path.exists(item.thumbnailPath()):
			self.ui.thumbnailButton.setPath(item.thumbnailPath())

		# Create the load widget and set the load schema
		self._formWidget = FXstudiolibrary.widgets.FormWidget(self)
		self._formWidget.setObjectName(item.__class__.__name__ + "Form")
		"""
		jesus
		self._formWidget.setSchema(item.loadSchema())
		"""
		self._formWidget.setValidator(self.loadValidator)
		self._formWidget.validate()

		self.ui.formFrame.layout().addWidget(self._formWidget)

		try:
			self.selectionChanged()
			self.setScriptJobEnabled(True)
		except NameError as error:
			logger.exception(error)

		self.updateThumbnailSize()

		self._item.loadValueChanged.connect(self._itemValueChanged)
		self.ui.acceptButton.clicked.connect(self.accept)
		'''
		jesus
		self.ui.selectionSetButton.clicked.connect(self.showSelectionSetsMenu)
		'''

	def loadValidator(self, *args, **kwargs):
		return self.item().loadValidator(*args, **kwargs)

	def createTitleWidget(self):
		"""
		Create a new instance of the title bar widget.

		:rtype: QtWidgets.QFrame
		"""
		class UI(object):
			"""Proxy class for attaching ui widgets as properties."""
			pass

		titleWidget = QtWidgets.QFrame(self)
		titleWidget.setObjectName("titleWidget")
		titleWidget.ui = UI()

		vlayout = QtWidgets.QVBoxLayout(self)
		vlayout.setSpacing(0)
		vlayout.setContentsMargins(0, 0, 0, 0)

		hlayout = QtWidgets.QHBoxLayout(self)
		hlayout.setSpacing(0)
		hlayout.setContentsMargins(0, 0, 0, 0)

		vlayout.addLayout(hlayout)

		titleButton = QtWidgets.QLabel(self)
		titleButton.setText(self.item().NAME)
		titleButton.setObjectName("titleButton")
		titleWidget.ui.titleButton = titleButton

		hlayout.addWidget(titleButton)
		'''
		jesus
		menuButton = QtWidgets.QPushButton(self)
		menuButton.setText("...")
		menuButton.setObjectName("menuButton")
		titleWidget.ui.menuButton = menuButton

		hlayout.addWidget(menuButton)
		'''

		titleWidget.setLayout(vlayout)

		return titleWidget

	def _itemValueChanged(self, field, value):
		"""
		Triggered when the a field value has changed.

		:type field: str
		:type value: object
		"""
		self._formWidget.setValue(field, value)

	def showMenu(self):
		"""
		Show the edit menu at the current cursor position.

		:rtype: QtWidgets.QAction
		"""
		menu = QtWidgets.QMenu(self)

		self.item().contextEditMenu(menu)

		point = QtGui.QCursor.pos()
		point.setX(point.x() + 3)
		point.setY(point.y() + 3)

		return menu.exec_(point)

	def loadUi(self):
		"""Convenience method for loading the .ui file."""
		FXstudioqt.loadUi(self, cls=BaseLoadWidget)

	def formWidget(self):
		"""
		Get the form widget instance.

		:rtype: FXstudiolibrary.widgets.formwidget.FormWidget
		"""
		return self._formWidget

	def setCustomWidget(self, widget):
		"""Convenience method for adding a custom widget when loading."""
		self.ui.customWidgetFrame.layout().addWidget(widget)

	def item(self):
		"""
		Get the library item to be created.

		:rtype: FXstudiolibrarymaya.BaseItem
		"""
		return self._item

	def showSelectionSetsMenu(self):
		"""Show the selection sets menu."""
		item = self.item()
		item.showSelectionSetsMenu()

	def resizeEvent(self, event):
		"""
		Overriding to adjust the image size when the widget changes size.

		:type event: QtCore.QSizeEvent
		"""
		self.updateThumbnailSize()

	def updateThumbnailSize(self):
		"""Update the thumbnail button to the size of the widget."""
		width = self.width() - 10
		if width > 250:
			width = 250

		size = QtCore.QSize(width, width)
		self.ui.thumbnailButton.setIconSize(size)
		self.ui.thumbnailButton.setMaximumSize(size)
		self.ui.thumbnailFrame.setMaximumSize(size)

	def close(self):
		"""Overriding this method to disable the script job when closed."""
		self.setScriptJobEnabled(False)

		if self.formWidget():
			self.formWidget().savePersistentValues()

		QtWidgets.QWidget.close(self)

	def scriptJob(self):
		"""
		Get the script job object used when the users selection changes.

		:rtype: FXmutils.ScriptJob
		"""
		return self._scriptJob

	def setScriptJobEnabled(self, enabled):
		"""
		Enable the script job used when the users selection changes.

		:type enabled: bool
		"""
		if enabled:
			if not self._scriptJob:
				event = ['SelectionChanged', self.selectionChanged]
				self._scriptJob = FXmutils.ScriptJob(event=event)
		else:
			sj = self.scriptJob()
			if sj:
				sj.kill()
			self._scriptJob = None

	def selectionChanged(self):
		"""Triggered when the users Maya selection has changed."""
		self.formWidget().validate()

	def accept(self):
		"""Called when the user clicks the apply button."""
		self.item().loadFromCurrentValues()
